Qt 6中的Qt多媒体(Qt Multimedia in Qt 6)

您所在的位置:网站首页 qt timeedit Qt 6中的Qt多媒体(Qt Multimedia in Qt 6)

Qt 6中的Qt多媒体(Qt Multimedia in Qt 6)

#Qt 6中的Qt多媒体(Qt Multimedia in Qt 6)| 来源: 网络整理| 查看: 265

Qt Multimedia in Qt 6

Qt 6.2的第一个测试版刚刚发布,在其他多个新插件中,有一个全新的Qt多媒体模块。

Qt多媒体模块在Qt 6中经历了一些相当大的变化。在许多方面,它是一个新的API和实现,尽管我们重新使用了Qt 5.15中的一些代码。

虽然我们试图在Qt 5和Qt 6之间为我们的大多数模块保持尽可能多的源兼容性,但我们不得不在这里做大的改变,以使API和实现适合未来,最后决定以最好的API为目标,而不是最大的兼容性。如果你一直在Qt 5中使用Qt多媒体,你将需要对你的实现做一些改变。

这篇博文将试图引导你了解最大的变化,同时关注API和内部结构。

目标

Qt 5中的Qt多媒体有一个相当松散的定义范围。对API的不同部分的支持在不同的后端并不一致,而且API本身的某些部分也不容易以跨平台的方式使用。

对于Qt 6,我们试图在某种程度上缩小范围,并且正在努力建立一套在所有支持的平台上都能使用的一致的功能。我们还没有完全达到这个目标,但希望在Qt 6.2.0发布时能填补大部分的实现空白。

我们希望在Qt 6.2中支持的主要用例是。

音频和视频播放 音频和视频录制(从相机和麦克风)。 低水平(基于PCM)音频和音频解码 与Qt Quick和Widgets集成 尽可能地使用硬件加速

据我们所知,这些功能涵盖了我们的用户在过去使用Qt多媒体的大部分用例。我们的目标是首先关注这些核心用例,并确保它们在我们所有的平台上运行一致,然后再扩展模块的新功能。

内部架构变化

Qt 5中的Qt多媒体有一个复杂的基于插件的架构,使用多个插件实现不同的前端功能。一个完整的多媒体后端实现将由不少于4个插件组成。用于实现这些插件的后端API是公开的,因此很难调整和改进这些后端的功能。

这种结构使得维护和开发模块非常困难。在Qt6中,我们选择了大幅简化,并删除了插件的基础设施。现在,后端在编译时被选择,并被编译到Qt多媒体的共享库中。现在只有一个涵盖所有多媒体的后端API,消除了我们在Qt 5中人为地分割成多个后端的情况。最后,我们选择了使后端API私有化,这样我们就可以在未来轻松地调整和扩展它。

一旦这样做了,我们就可以仔细看看我们需要的API和接口,以适应依赖于平台的后端代码。我们成功地将实现多媒体后端所需的类集从40个减少到15个,并减少了纯虚拟方法的数量,为许多非必要的功能提供了后备实现。

新的后端API在某种程度上是以我们在Qt Gui中用于窗口系统集成的QPA架构为模型的,新的QPlatformMediaIntegration类现在确实作为一个共同的入口点和工厂类来实例化依赖于平台的后端对象。在大多数情况下,我们现在的目标是在公共API中的类和实现该功能的类之间建立1对1的关系。因此,公共的QMediaPlayer API有一个QPlatformMediaPlayer类来实现平台依赖的功能。

通过这些改变,我们还可以删除大量在前端和后端之间重复的代码,并避免它们之间大量的调用转发。这样一来,我们也可以把很多跨平台的功能和验证转移到共享的、独立于平台的代码部分。

总的来说,这大大简化了我们的代码库,在不损失大量功能的情况下,大大减少了代码量。5.15版的Qt多媒体大约有140.000行代码,而我们目前在Qt 6中已经减少到大约74.000行代码。

支持的后端

在Qt 6中,我们也重新审视了支持的后端,并将这些后端减少到我们认为可以在未来支持的一组。在Qt 5中,我们在Windows上有三个完全不同的后端实现,使用DirectShow、WMF和一个单独的基于WMF的WinRT实现。

在Qt 6中,目前支持的集合是。

Linux,使用GStreamer macOS和iOS使用AVFoundation Windows使用WMF 安卓系统使用MediaPlayer和Camera Java APIs 计划在Qt 6.3中对QNX提供支持。我们也可能在6.2版本的WebAssembly上实现低级别的音频工作。此外,我们还有使用PulseAudio或ALSA在Linux上支持低水平音频的代码,但这些代码目前还没有测试或支持。根据需求,我们可能会在以后的版本中把它们带回来。 公共API

Qt多媒体的公共API由5个大型功能块组成。其中三个块在Qt 5中已经存在,但这些块中的API已经发生了重大变化。这些功能块是:。

设备发现 低水平音频 播放和解码 捕获和录制 视频输出管线 在做新的API时,我们的目标也是在C++和QML之间有一个统一的API。这使得我们有可能删除大量的代码,这些代码只是简单地包装了C++的API,并以稍微不同的方式暴露给QML。对于大多数公共的C++类,现在都有一个相应的QML项目具有相同的名称。因此,例如,QMediaPlayer有一个相应的QML MediaPlayer项目,其API与C++类相同。

让我们来看看不同功能块的更多细节。

设备发现

让我们从设备发现开始。新的QMediaDevices类是为你提供关于可用的音频和视频设备的信息。它将允许你列出可用的音频输入(通常是麦克风)、音频输出(扬声器和耳麦)和摄像机。你可以检索默认设备,该类也会通知你配置的任何变化,例如,当用户连接一个外部耳机时。

QMediaDevices devices; connect(&devices, &QMediaDevices::audioInputsChanged,         []() { qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3